package org.apache.commons.logging;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 * Centraliza o controle do stream de saída de erros.
 */
public class DiagnosticsStream {
    
    /**
     * Um prefixo para cada mensagem de saída
     * logDiagnostic method, so that users can clearly see which
     * LogFactory class is generating the output.
     */
    private static String diagnosticPrefix;
    
    /**
     * A Stream de saída.
     */
    private static PrintStream stream;

    /**
     * Construtor da classe.
     */
	public DiagnosticsStream() {
    	diagnosticPrefix = null;
    	stream = null;
    }
    
	/**
	 * Retorna o prefixo.
	 * @return O prefixo.
	 */
    public static String getDiagnosticPrefix() {
		return diagnosticPrefix;
	}

    /**
     * Altera o prefixo.
     * @param diagnosticPrefix O novo prefixo.
     */
	public static void setDiagnosticPrefix(String diagnosticPrefix) {
		DiagnosticsStream.diagnosticPrefix = diagnosticPrefix;
	}

	/**
	 * Habilita o stream para a saída de erro padrão.
	 */
	public void enableSystemErrStream() {
		stream = System.err;
	}

	/**
	 * Habilita o stream para a saída padrão.
	 */
	public void enableSystemOutStream() {
		stream = System.out;
	}

	/**
	 * Habilita o stream para aum FileOutputStream informado.
	 */
	public void enableFileOutputStream(FileOutputStream fos) throws FileNotFoundException {
		stream = new PrintStream(fos);
	}

	/**
	 * Retorna o stream usado.
	 * @return O stream usado.
	 */
	public PrintStream getStream() {
		return stream;
	}
	
    /**
     * Indica se o stream está habilitado.
     * 
     * @return true se o stream está habilitado.
     */
	public static boolean isEnabled() {
		return stream != null;
	}
	
	/**
	 * Loga uma mensagem com o prefixo definido neste objeto.
	 * @param msg A mensagem para o log.
	 */
	public static final void logDiagnostic(String msg) {
		logDiagnostic(msg, true);
	}
	
	/**
	 * Loga uma mensagem com a opção de usar ou não o prefixo definido.
	 * @param msg A mensagem para o log.
	 */
	public static final void logDiagnostic(String msg, boolean printPrefix) {
		if (isEnabled()) {
			if (printPrefix)
				stream.print(diagnosticPrefix);
			stream.println(msg);
			stream.flush();
		}
	}
}
